home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Carnage_Contest / scripts / CC Original / weapons / Grenade.lua < prev    next >
Text File  |  2010-08-31  |  6KB  |  173 lines

  1. --------------------------------------------------------------------------------
  2. -- Weapon Grenade + Projectile Grenade
  3. -- Original Carnage Contest Weapon
  4. -- Script by DC, August 2009, www.UnrealSoftware.de
  5. --------------------------------------------------------------------------------
  6.  
  7. -- Setup Tables
  8. if cc==nil then cc={} end
  9. cc.grenade={}
  10. cc.grenade.grenade={}
  11.  
  12. -- Load & Prepare Ressources
  13. cc.grenade.gfx_wpn=loadgfx("weapons/grenade.bmp")                    -- Weapon Image
  14. setmidhandle(cc.grenade.gfx_wpn)
  15. cc.grenade.sfx_attack=loadsfx("throw.ogg")                            -- Attack Sound
  16. cc.grenade.sfx_bounce=loadsfx("bounce.wav")                            -- Bounce Sound
  17.  
  18. --------------------------------------------------------------------------------
  19. -- Weapon: Grenade
  20. --------------------------------------------------------------------------------
  21.  
  22. cc.grenade.id=addweapon("cc.grenade","Grenade",cc.grenade.gfx_wpn)    -- Add Weapon
  23.  
  24. function cc.grenade.draw()                                            -- Draw
  25.     if weapon_shots<=0 then
  26.         setblend(blend_alpha)
  27.         setalpha(1)
  28.         setcolor(255,255,255)
  29.         drawinhand(cc.grenade.gfx_wpn,6,0)
  30.     end
  31.     -- HUD chargebar
  32.     if weapon_charge>0 and weapon_shots==0 then
  33.         hudchargebar(weapon_charge,100)
  34.     end
  35.     -- HUD Crosshair / HUD Timer
  36.     if weapon_shots==0 then
  37.         hudcrosshair(4,3)
  38.         hudtimer(3,1,10)
  39.     end
  40. end
  41.  
  42. function cc.grenade.attack(attack)                                    -- Attack
  43.     if (weapon_shots<=0) then
  44.         -- Charge
  45.         if (attack==1) then
  46.             weapon_charge=weapon_charge+1                            -- Increase charge
  47.         end
  48.         -- Fire a projectile (on release/full charge)
  49.         if (attack==0 and weapon_charge>0) or (weapon_charge>=100) then
  50.             -- No more weapon switching!
  51.             useweapon(0)
  52.             playsound(cc.grenade.sfx_attack)
  53.             weapon_shots=weapon_shots+1
  54.             id=createprojectile(cc.grenade.grenade.id)
  55.             projectiles[id]={}
  56.             -- Ignore collision with current player at beginning
  57.             projectiles[id].ignore=playercurrent()
  58.             -- Set initial position of projectile
  59.             projectiles[id].x=getplayerx(0)+(4*getplayerdirection(0))
  60.             projectiles[id].y=getplayery(0)+3
  61.             -- Initial collision check (avoid throwing into other objects)
  62.             for i=0,10,1 do
  63.                 if collision(col5x5,projectiles[id].x+math.sin(math.rad(getplayerrotation(0)))*i,projectiles[id].y-math.cos(math.rad(getplayerrotation(0)))*i)==1 then
  64.                     if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  65.                         if (i==0) then
  66.                             projectiles[id].x=getplayerx(0)
  67.                             projectiles[id].y=getplayery(0)+3
  68.                             break
  69.                         else
  70.                             projectiles[id].x=getplayerx(0)+(4*getplayerdirection(0))+math.sin(math.rad(getplayerrotation(0)))*(i-1)
  71.                             projectiles[id].y=getplayery(0)+3-math.cos(math.rad(getplayerrotation(0)))*(i-1)
  72.                             break
  73.                         end
  74.                     end
  75.                 end
  76.             end
  77.             -- Set speed of projectile
  78.             projectiles[id].sx=math.sin(math.rad(getplayerrotation(0)))*(weapon_charge/100.0)*10.0
  79.             projectiles[id].sy=-math.cos(math.rad(getplayerrotation(0)))*(weapon_charge/100.0)*10.0
  80.             -- Set timer
  81.             projectiles[id].timer=weapon_timer*50
  82.             -- Effects
  83.             recoil(2)
  84.             -- End Turn
  85.             endturn()
  86.         end
  87.     end
  88. end
  89.  
  90. --------------------------------------------------------------------------------
  91. -- Projectile: Grenade
  92. --------------------------------------------------------------------------------
  93.  
  94. cc.grenade.grenade.id=addprojectile("cc.grenade.grenade")    -- Add Projectile
  95.  
  96. function cc.grenade.grenade.draw(id)                        -- Draw
  97.     -- Setup draw mode
  98.     setblend(blend_alpha)
  99.     setalpha(1)
  100.     setcolor(255,255,255)
  101.     setscale(1,1)
  102.     -- Calculate projectile rotation
  103.     setrotation(math.deg(math.atan2(projectiles[id].sx,-projectiles[id].sy)))
  104.     -- Draw projectile
  105.     drawimage(cc.grenade.gfx_wpn,projectiles[id].x,projectiles[id].y)
  106.     -- Draw Arrow if out of Screen
  107.     outofscreenarrow(projectiles[id].x,projectiles[id].y)
  108. end
  109.  
  110. function cc.grenade.grenade.update(id)                        -- Update
  111.     -- Gravity influence on speed
  112.     projectiles[id].sy=projectiles[id].sy+getgravity()
  113.     -- Move (in substep loop for optimal collision precision)
  114.     msubt=math.ceil(math.max(math.abs(projectiles[id].sx),math.abs(projectiles[id].sy))/3)
  115.     msubx=projectiles[id].sx/msubt
  116.     msuby=projectiles[id].sy/msubt
  117.     for i=1,msubt,1 do
  118.         -- Move X
  119.         projectiles[id].x=projectiles[id].x+msubx
  120.         if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  121.             if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  122.                 if (math.abs(projectiles[id].sx)>0.5) then playsound(cc.grenade.sfx_bounce) end
  123.                 projectiles[id].x=projectiles[id].x-msubx
  124.                 projectiles[id].sx=-projectiles[id].sx*0.3
  125.                 msubx=-msubx*0.3
  126.             end
  127.         else
  128.             projectiles[id].ignore=0
  129.         end
  130.         -- Move Y
  131.         projectiles[id].y=projectiles[id].y+msuby
  132.         if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  133.             if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  134.                 if (math.abs(projectiles[id].sy)>0.5) then playsound(cc.grenade.sfx_bounce) end
  135.                 projectiles[id].y=projectiles[id].y-msuby
  136.                 projectiles[id].sy=-projectiles[id].sy*0.3
  137.                 msuby=-msuby*0.3
  138.                 projectiles[id].sx=projectiles[id].sx*0.9
  139.                 msubx=msubx*0.9
  140.             end
  141.         else
  142.             projectiles[id].ignore=0
  143.         end        
  144.         -- Water
  145.         if (projectiles[id].y)>getwatery()+5 then
  146.             -- Effects
  147.             particle(p_waterhit,projectiles[id].x,projectiles[id].y)
  148.             playsound(sfx_hitwater1)
  149.             -- Free projectile
  150.             freeprojectile(id)
  151.             break
  152.         end
  153.     end
  154.     -- Timer -> Explode
  155.     projectiles[id].timer=projectiles[id].timer-1
  156.     if projectiles[id].timer<=0 then
  157.         -- Cause damage
  158.         arealdamage(projectiles[id].x,projectiles[id].y,100,50)
  159.         -- Destroy terrain
  160.         terrainexplosion(projectiles[id].x,projectiles[id].y,30,1)
  161.         -- Crater
  162.         grey=math.random(0,40)
  163.         if math.random(0,1)==1 then
  164.             terrainalphaimage(gfx_crater100,projectiles[id].x,projectiles[id].y,math.random(6,9)*0.1,grey,grey,grey)
  165.         else
  166.             terrainalphaimage(gfx_crater125,projectiles[id].x,projectiles[id].y,math.random(6,9)*0.1,grey,grey,grey)
  167.         end
  168.         -- Free projectile
  169.         freeprojectile(id)
  170.     end
  171.     -- Scroll to projectile
  172.     scroll(projectiles[id].x,projectiles[id].y)
  173. end